﻿// 1072. 树的最长路径.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using  namespace std;

/*
https://www.acwing.com/problem/content/1074/


给定一棵树，树中包含 n个结点（编号1~n）和 n−1 条无向边，每条边都有一个权值。
现在请你找到树中的一条最长路径。
换句话说，要找到一条路径，使得使得路径两端的点的距离最远。

注意：路径中可以只包含一个点。

输入格式
第一行包含整数 n。

接下来 n−1行，每行包含三个整数 ai,bi,ci
，表示点 ai 和 bi 之间存在一条权值为 ci 的边。

输出格式
输出一个整数，表示树的最长路径的长度。

数据范围
1≤n≤10000
,
1≤ai,bi≤n
,
−105≤ci≤105
输入样例：
6
5 1 6
1 4 5
6 3 9
2 6 8
6 1 7
输出样例：
22


4
1 2 1
2 3 -100
3 4 2
*/

const int N = 10010, M = N * 2;
int h[N], e[M], ne[M], w[M], idx;
int d1[N], d2[N];
int n;
int ans;

void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int x, int father) {

	for (int i = h[x]; i != -1; i = ne[i]) {
		int j = e[i];
		if (j == father) continue;
		int d = dfs(j, x) + w[i];
		if (d >= d1[x]) {
			d2[x] = d1[x];
			d1[x] = d;
		}
		else if (d > d2[x]) {
			d2[x] = d;
		}
	}

	ans = max(ans, d1[x] + d2[x]);

	return d1[x];
}


int main()
{
	memset(h, -1, sizeof h);
	scanf("%d", &n);
	for (int i = 1; i < n; i++) {
		int a, b, c; scanf("%d%d%d", &a, &b, &c);
		add(a, b, c); add(b, a, c);
	}
	ans = -0x3f3f3f3f;
	dfs(1, -1);

	cout << ans << endl;

	return 0;
}

